home *** CD-ROM | disk | FTP | other *** search
- // view powerd binary module (#?.b) generated by powerd v0.12
-
- // 1.0 initial release
- // 1.1 (27.1.2001) added unions (in binary modules introduced with PowerD 0.17)
-
- BYTE 0,0,'$VER:dmod v1.1 by MarK (27.1.2001)',0,0
-
- PROC DisplayMODULE(mem:PTR TO CHAR)
- DEF ver,rev,count,nl,ml,namelist:PTR TO CHAR,type,flags,acount,rcount,l,offset,
- base:PTR TO CHAR
-
- IF Long(mem)<>"DMOD"
- PrintF('\s: unknown filetype','dmod')
- RETURN
- ENDIF
- mem+=4 // skip "DMOD"
- ver:=Word(mem)
- rev:=Word(mem+2)
- mem+=4 // skip ver,rev
- PrintF('// requied version of powerd: v\d.\z\d[2]\n\n',ver,rev)
-
- IF Long(mem)="MODS"
- PrintF('MODULE\t')
- count:=Word(mem+4)
- mem+=6
- WHILE count
- count--
- nl:=Word(mem)
- mem+=2
- PrintF('''\s''',mem)
- mem+=nl+1
- IF Odd(mem) THEN mem++
- IF CtrlC() THEN RETURN
- EXITIF count=0 DO PrintF('\n\n')
- PrintF(',\n\t\t\t')
- ENDWHILE
- ENDIF
-
- IF Long(mem)="CNST" // constant list
- PrintF('CONST\t')
- count:=Word(mem+4) // count of constants
- ml:=Long(mem+6)
- nl:=Long(mem+10)
- mem+=14
- namelist:=mem+ml
- WHILE count
- count--
- PrintF('\s=',namelist)
- type:=UByte(mem++)
- flags:=UByte(mem++)
- IF type=$ff
- PrintF('0')
- ELSEIF type=8 // DT_DOUBLE
- PrintF('$\z\h[8].\z\h[8]',Long(mem),Long(mem+4))
- mem+=8
- ELSEIF flags&%10 // S_TAG
- PrintF('$\h',Word(mem)|$80000000)
- mem+++
- ELSEIF type=3 // DT_WORD
- PrintF('\d',Word(mem))
- mem+++
- ELSE
- acount:=Long(mem)
- PrintF(IF acount>=-32768 AND acount<=32767 THEN '\d' ELSE '$\h',acount)
- // PrintF(IF Long(mem)>=-32768 AND Long(mem)<=32767 THEN '\d' ELSE '$\h',Long(mem))
- mem+=4
- ENDIF
- namelist+=StrLen(namelist)+1
- IF namelist[0]="\0" THEN namelist++
- IF CtrlC() THEN RETURN
- EXITIF count=0 DO PrintF('\n\n')
- PrintF(',\n\t\t')
- ENDWHILE
- IF Odd(namelist) THEN namelist++
- mem:=namelist
- ENDIF
-
- IF Long(mem)="OBJC" -> object list
- ml:=Long(mem+4)
- nl:=Long(mem+8)
- acount:=Word(mem+12)
- count:=Word(mem+14)
- mem+=16
- namelist:=mem+ml
-
- WHILE acount
- mem,namelist:=LoadOBJECT(mem,namelist)
- acount--
- IF CtrlC() THEN RETURN
- ENDWHILE
-
- IF Odd(namelist) THEN namelist++
- mem:=namelist
- ENDIF
-
- IF Long(mem)="#def" -> #define list
- count:=Word(mem+4)
- acount:=Word(mem+6)
- ml:=Long(mem+8)
- nl:=Long(mem+12)
- mem+=16
- namelist:=mem+ml
-
- WHILE count
- count--
- PrintF('#define \s',namelist)
- namelist+=mem[1]+1
- l:=Word(mem+2)
- acount:=mem[0]
- mem+=4
- IF acount
- PrintF('(')
- WHILE acount
- PrintF('\s',namelist)
- namelist+=mem[1]+1
- mem+++
- acount--
- IF CtrlC() THEN RETURN
- EXITIF acount=0 DO PrintF(') ')
- PrintF(',')
- ENDWHILE
- ELSE PrintF(' ')
- PrintF('\s\n',namelist)
- namelist+=l+1
- IF CtrlC() THEN RETURN
- ENDWHILE
-
- IF Odd(namelist) THEN namelist++
- mem:=mem+nl
- ENDIF
-
- IF Long(mem)="LIBR" // function list
- count:=Word(mem+4) // count of functions
- nl:=Word(mem+6) // base name length
- ml:=Long(mem+12) // block length
- mem+=16
- base:=mem
- mem+=nl
- IF mem[0]="\0" THEN mem++
- namelist:=mem+ml
- PrintF('LIBRARY \s\n\t',base)
-
- WHILE count
- count--
- offset:=Word(mem)
- acount:=mem[2]
- rcount:=mem[3]&$1f
- ver:=mem[3]>>5 // get ppc function type
- SELECT ver
- CASE 0; PrintF('M68K,')
- CASE 1; PrintF('PPC,')
- CASE 2; PrintF('PPC2,')
- CASE 3; PrintF('PPC0,')
- ENDSELECT
- mem+=4
- PrintF('\s(',namelist)
- namelist+=StrLen(namelist)+1
- WHILE acount
- acount--
- IF ver
- SELECT mem[2]
- CASE 0 TO 31; PrintF('r\d',mem[2]&%11111)
- CASE 32 TO 63; PrintF('f\d',mem[2]&%11111)
- ENDSELECT
- ELSE
- SELECT mem[2]
- CASE 0 TO 7; PrintF('d\d',mem[2]&%111)
- CASE 8 TO 15; PrintF('a\d',mem[2]&%111)
- CASE 16 TO 23; PrintF('fp\d',mem[2]&%111)
- ENDSELECT
- ENDIF
- type:=mem[0]
- flags:=mem[1] // means default value set
- nl:=mem[3]
- mem+=4
- IF flags
- IF type=8
- PrintF('=$\z\h[8].\z\h[8]',Long(mem),Long(mem+4))
- mem+=8
- ELSE
- PrintF('=$\d',Long(mem))
- mem+=4
- ENDIF
- ENDIF
- IF type
- PrintF(':\s',TypeStr(type))
- ENDIF
- IF nl
- PrintF('\s',namelist)
- namelist+=nl+1
- ENDIF
- EXITIF acount=0
- PrintF(',')
- IF CtrlC() THEN RETURN
- ENDWHILE
- PrintF(')')
-
- IF rcount
- PrintF('(')
- WHILE rcount
- rcount--
- IF ver
- SELECT mem[2]
- CASE 0 TO 31; PrintF('r\d',mem[2]&%11111)
- CASE 32 TO 63; PrintF('f\d',mem[2]&%11111)
- ENDSELECT
- ELSE
- SELECT mem[2]
- CASE 0 TO 7; PrintF('d\d',mem[2]&%111)
- CASE 8 TO 15; PrintF('a\d',mem[2]&%111)
- CASE 16 TO 23; PrintF('fp\d',mem[2]&%111)
- ENDSELECT
- ENDIF
- type:=mem[0]
- nl:=mem[3]
- mem+=4
- IF type
- PrintF(':\s',TypeStr(type))
- ENDIF
- IF nl
- PrintF('\s',namelist)
- namelist+=nl+1
- ENDIF
- EXITIF rcount=0 DO PrintF(')')
- PrintF(',')
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDIF
- PrintF('=\d',offset)
- IF CtrlC() THEN RETURN
- EXITIF count=0 DO PrintF('\n\n')
- PrintF(',\n\t')
- ENDWHILE
- IF Odd(namelist) THEN namelist++
- mem:=namelist
- ENDIF
-
- IF Long(mem)="EXPR" // external function list
- count:=Word(mem+4)
- ml:=Long(mem+10)
- nl:=Long(mem+14)
- mem+=18
- namelist:=mem+ml
-
- WHILE count
- count--
- SELECT type:=mem[0]
- CASE 11; PrintF('EPROC')
- CASE 13; PrintF('LPROC')
- CASE 14; PrintF('RPROC')
- ENDSELECT
- /*
- IF StrCmp(namelist,'Ror')
- xxxxxx:
- l:=l
- ENDIF
- */
- PrintF(' \s(',namelist)
- namelist+=StrLen(namelist)+1
- flags:=mem[1]
- acount:=mem[2]
- rcount:=mem[3]
- mem+=4
- offset:=0
- IF flags&%01
- offset:=namelist
- namelist+=StrLen(namelist)+1
- ENDIF
-
- IF type=14
- IF flags&%10
- l:=namelist
- namelist+=StrLen(namelist)+1
- ELSE
- l:=NIL
- ENDIF
- ENDIF
-
- WHILE acount
- acount--
- type:=mem[0]
- flags:=mem[1]
- SELECT mem[3]
- CASE 0 TO 7; PrintF('d\d',mem[3]&%111)
- CASE 8 TO 15; PrintF('a\d',mem[3]&%111)
- CASE 16 TO 23; PrintF('fp\d',mem[3]&%111)
- DEFAULT; PrintF('\c',"z"-acount) // stack
- ENDSELECT
- mem+=4
- IF flags&%01
- IF type=8 // DT_DOUBLE
- PrintF('=$\z\h[8].\z\h[8]',Long(mem),Long(mem+4))
- mem+=8
- ELSE
- PrintF('=\d',Long(mem))
- mem+=4
- ENDIF
- ENDIF
- IF type
- PrintF(':\s',TypeStr(type))
- IF flags&%10
- PrintF('\s',namelist)
- namelist+=StrLen(namelist)+1
- ENDIF
- ENDIF
- EXITIF acount=0
- PrintF(',')
- IF CtrlC() THEN RETURN
- ENDWHILE
- PrintF(')')
-
- IF rcount
- PrintF('(')
- WHILE rcount
- rcount--
- type:=mem[0]
- SELECT mem[1]
- CASE 0 TO 7; PrintF('d\d',mem[1]&%111)
- CASE 8 TO 15; PrintF('a\d',mem[1]&%111)
- CASE 16 TO 23; PrintF('fp\d',mem[1]&%111)
- ENDSELECT
- mem+++
- IF type THEN PrintF(':\s',TypeStr(type))
- IF type=10 OR type=42 OR type=74 OR type=138
- PrintF('\s',namelist)
- namelist+=StrLen(namelist)+1
- ENDIF
- EXITIF rcount=0 DO PrintF(')')
- PrintF(',')
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDIF
-
- IF offset THEN PrintF(' OF \s',offset)
- IF l THEN PrintF('=''\s''',l)
- IF CtrlC() THEN RETURN
- PrintF('\n')
- ENDWHILE
- PrintF('\n')
- IF Odd(namelist) THEN namelist++
- mem+=nl
- ENDIF
-
- IF Long(mem)="EDEF"
- PrintF('EDEF\t')
- count:=Word(mem+4)
- ml:=Long(mem+6)
- nl:=Long(mem+10)
- mem+=14
- namelist:=mem+ml
-
- WHILE count
- count--
- PrintF('\s',namelist)
- namelist+=StrLen(namelist)+1
- IF mem[0] THEN PrintF(':\s',TypeStr(mem[0]))
- IF mem[1]
- PrintF('\s',namelist)
- namelist+=StrLen(namelist)+1
- ENDIF
- mem+++
- EXITIF count=0 DO PrintF('\n\n')
- PrintF(',\n\t\t')
- IF CtrlC() THEN RETURN
- ENDWHILE
- mem+=nl
- ENDIF
-
- IF Long(mem)="LINK"
- PrintF('OPT\t')
- count:=Word(mem+4)
- mem:=mem+6
- WHILE count
- count--
- nl:=Word(mem)
- mem+++
- PrintF('''\s''',mem)
- mem:=mem+nl
- IF Odd(nl) THEN mem++
- EXITIF count=0 DO PrintF('\n')
- PrintF(',\n\t\t')
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDIF
-
- IF Long(mem)="HEAD"
- nl:=Word(mem+4)
- mem+=6
- PrintF('OPT\tHEAD=''\s''\n',mem)
- mem+=nl
- IF Odd(nl) THEN mem++
- ENDIF
-
- ENDPROC
-
- PROC LoadOBJECT(mem:PTR TO CHAR,nmem:PTR TO CHAR)(PTR TO CHAR,PTR TO CHAR)
- IF mem[0]=0
- PrintF('OBJECT \s',nmem)
- nmem+=mem[1]+1
- IF mem[2]
- PrintF(' OF \s\n',nmem)
- nmem+=mem[2]+1
- ELSE PrintF('\n')
- mem+=8
- WHILE mem[0]=1
- mem,nmem:=LoadOBJECT(mem,nmem)
- ELSEWHILE mem[0]=2
- mem,nmem:=LoadOBJECT(mem,nmem)
- ALWAYS
- EXITIF mem[0]<>1 AND mem[0]<>2 DO PrintF('\n\n')
- PrintF(',\n')
- IF CtrlC() THEN RETURN
- ENDWHILE
- ELSEIF mem[0]=1
- PrintF('\t\s',nmem)
- nmem+=mem[1]+1
- IF Word(mem+6) THEN PrintF('[\d]',Word(mem+6))
- PrintF(':\s',TypeStr(mem[2]))
- IF mem[5]
- PrintF('\s',nmem)
- nmem+=mem[5]+1
- ENDIF
- mem+=10
- ELSEIF mem[0]=2
- DEF count,first=TRUE
- WHILE mem[0]=2
- PrintF('\t\s \s\n',IF first THEN 'OBJECT' ELSE 'UNION',nmem)
- nmem+=mem[1]+1
- count:=mem[2]
- mem+=6
- WHILE count
- count--
- PrintF('\t')
- mem,nmem:=LoadOBJECT(mem,nmem)
- PrintF(IF mem[0]=1 AND count>0 THEN ',\n' ELSE '\n')
- IF CtrlC() THEN RETURN
- ENDWHILE
- first:=FALSE
- ENDWHILE
- PrintF('\tENDOBJECT')
- ENDIF
- ENDPROC mem,nmem
-
- PROC TypeStr(type)(PTR TO CHAR)
- DEF str:PTR TO CHAR
- SELECT type
- CASE 1; str:='LONG'
- CASE 2; str:='ULONG'
- CASE 3; str:='WORD'
- CASE 4; str:='UWORD'
- CASE 5; str:='BYTE'
- CASE 6; str:='UBYTE'
- CASE 7; str:='FLOAT'
- CASE 8; str:='DOUBLE'
- CASE 9; str:='BOOL'
- CASE 10; str:=NIL
- CASE 11; str:='PTR'
- CASE 12; str:='DLONG'
- CASE 13; str:='UDLONG'
- CASE 14; str:='STRING'
-
- CASE 33; str:='PTR TO LONG'
- CASE 34; str:='PTR TO ULONG'
- CASE 35; str:='PTR TO WORD'
- CASE 36; str:='PTR TO UWORD'
- CASE 37; str:='PTR TO BYTE'
- CASE 38; str:='PTR TO UBYTE'
- CASE 39; str:='PTR TO FLOAT'
- CASE 40; str:='PTR TO DOUBLE'
- CASE 41; str:='PTR TO BOOL'
- CASE 42; str:='PTR TO '
- CASE 43; str:='PTR TO PTR'
- CASE 44; str:='PTR TO DLONG'
- CASE 45; str:='PTR TO UDLONG'
- CASE 46; str:='PTR TO CHAR'
-
- CASE 65; str:='PTR TO PTR TO LONG'
- CASE 66; str:='PTR TO PTR TO ULONG'
- CASE 67; str:='PTR TO PTR TO WORD'
- CASE 68; str:='PTR TO PTR TO UWORD'
- CASE 69; str:='PTR TO PTR TO BYTE'
- CASE 70; str:='PTR TO PTR TO UBYTE'
- CASE 71; str:='PTR TO PTR TO FLOAT'
- CASE 72; str:='PTR TO PTR TO DOUBLE'
- CASE 73; str:='PTR TO PTR TO BOOL'
- CASE 74; str:='PTR TO PTR TO '
- CASE 75; str:='PTR TO PTR TO PTR'
- CASE 76; str:='PTR TO PTR TO DLONG'
- CASE 77; str:='PTR TO PTR TO UDLONG'
- CASE 78; str:='PTR TO PTR TO CHAR'
-
- CASE 129;str:='LIST OF LONG'
- CASE 130;str:='LIST OF ULONG'
- CASE 131;str:='LIST OF WORD'
- CASE 132;str:='LIST OF UWORD'
- CASE 133;str:='LIST OF BYTE'
- CASE 134;str:='LIST OF UBYTE'
- CASE 135;str:='LIST OF FLOAT'
- CASE 136;str:='LIST OF DOUBLE'
- CASE 137;str:='LIST OF BOOL'
- CASE 138;str:='LIST OF '
- CASE 139;str:='LIST OF PTR'
- CASE 140;str:='LIST OF DLONG'
- CASE 141;str:='LIST OF UDLONG'
- CASE 142;str:='LIST OF CHAR'
- DEFAULT; str:='VOID'
- ENDSELECT
- ENDPROC str
-
- MODULE 'exec/memory'
-
- ENUM SOURCE
-
- PROC main()
- DEF rda,args=[0,0]:LONG,l,m:PTR TO CHAR,f
- IF rda:=ReadArgs('SOURCE/A',args,NIL)
- l:=FileLength(args[SOURCE])
- IF f:=Open(args[SOURCE],OLDFILE)
- IF m:=AllocMem(l+8,MEMF_PUBLIC|MEMF_CLEAR)
- IF Read(f,m,l)=l
- DisplayMODULE(m)
- ELSE PrintFault(IOErr(),'dmod')
- FreeMem(m,l+8)
- ELSE PrintF('\s: not enough memory\n','dmod')
- Close(f)
- ELSE PrintFault(IOErr(),'dmod')
- FreeArgs(rda)
- ELSE PrintFault(IOErr(),'dmod')
- ENDPROC
-